#ifndef DATA_MODEL_TEST_TREE_MODEL_HPP
#define DATA_MODEL_TEST_TREE_MODEL_HPP

#include "core_data_model/abstract_item_model.hpp"
#include "core_data_model/i_item_role.hpp"

#include <memory>

namespace wgt
{
class TestTreeModel : public AbstractTreeModel
{
public:
	TestTreeModel();
	TestTreeModel(const TestTreeModel& rhs);
	virtual ~TestTreeModel();

	TestTreeModel& operator=(const TestTreeModel& rhs);

	virtual AbstractItem* item(const ItemIndex& index) const override;
	virtual ItemIndex index(const AbstractItem* item) const override;
	virtual Variant getData(int row, int column, ItemRole::Id roleId) const override;
	virtual bool setData(int row, int column, ItemRole::Id roleId, const Variant& data) override;

	virtual int rowCount(const AbstractItem* item) const override;
	virtual int columnCount() const override;

	virtual bool moveRows(const AbstractItem* sourceParent, int sourceRow, int count,
	                      const AbstractItem* destinationParent, int destinationChild) override;
	virtual std::vector<std::string> roles() const override;

	virtual Connection connectPreRowsMoved(TestTreeModel::MoveCallback callback) override;
	virtual Connection connectPostRowsMoved(TestTreeModel::MoveCallback callback) override;
	virtual Connection connectPreItemDataChanged(TestTreeModel::DataCallback callback) override;
	virtual Connection connectPostItemDataChanged(TestTreeModel::DataCallback callback) override;

private:
	struct Implementation;
	std::unique_ptr<Implementation> impl_;
};
} // end namespace wgt
#endif
